import { nilV } from "utils";
import { CancelError } from "../../error";
import type { InnerRequestConfig } from "../../types/InnerRequestConfig";
// 是不是取消的请求
function isCancelRequest(config: InnerRequestConfig, msg: string | null) {
    if (config.cancelToken && config.cancelToken.hasCanceledFlag) {
        let errMsg = msg || "";
        let lower = errMsg.toLowerCase();
        // #ifdef H5 || MP-WEIXIN
        return lower.indexOf("abort") >= 0;
        // #endif
        // #ifdef APP-PLUS
        let hasAbort = lower.indexOf("abort") >= 0;
        if (hasAbort) {
            // 判断是否 有statusCode, 没有 才是 cancel
            let hasStatusCode = lower.indexOf("有statuscode") >= 0;
            return !hasStatusCode;
        }
        return false;
        // #endif

        // #ifndef H5 || MP-WEIXIN || APP-PLUS
        return lower.indexOf("abort") >= 0;
        // #endif
    } else {
        return false;
    }
}

// 是不是 没有网, 超时的错误
function isDropError(msg: string | null) {
    let errMsg = msg || "";
    let lower: string = errMsg.toLowerCase();
    let matchFail = lower.match(/request[\s\S]+fail/);
    return !nilV(matchFail);
}

// 是否 要 取消 请求
function throwIfCancellationRequested(config: InnerRequestConfig) {
    // 有没有配置  cancelToken
    if (config.cancelToken) {
        // 是否已经  标记为 取消了
        if (config.cancelToken.hasCanceledFlag) {
            let reason = config.cancelToken.reason;
            return Promise.reject(new CancelError(reason));
        }
    }
    return null;
}

export { throwIfCancellationRequested, isCancelRequest, isDropError };
